package main

/*
* Content: map声明-初始化方式、map取值、遍历map、删除元素、切片类型的map
* --------------------------------------------------
* Go map详解和实战: https://juejin.cn/post/7072905649708859429
 */

import "fmt"

func MyMap() {
	// map是一种key:value键值对的数据结构容器。map内部实现是哈希表(hash)。

	// map声明-初始化方式
	fmt.Println("--------------------map声明-初始化方式--------------------")

	// 声明map -- 未初始化 时为 nil
	var m1 map[string]int // s1 == nil
	fmt.Printf("m1==nil: %v\n", m1 == nil)

	// 初始化方式1 -  - 最不常用的方式
	var m2 map[string]int = make(map[string]int, 5)
	m2["xqz"] = 18
	m2["wss"] = 17
	fmt.Printf("m2: %v\n", m2)

	// 初始化方式2 - 自动判断类型
	var m3 = make(map[string]int, 5)
	fmt.Printf("m3: %v\n", m3)

	// 初始化方式3 - 最常用的方式
	m4 := make(map[string]int, 5) // 应当估算好map的容量，避免在程序运行期间 动态扩容
	m4["xqz"] = 18
	m4["wss"] = 17
	fmt.Printf("m4: %v\n", m4)

	// 初始化方式4
	m5 := map[string]string{
		"a": "aaa",
		"b": "bbb",
		"c": "ccc",
	}
	fmt.Printf("m5: %v\n", m5)

	// map取值
	fmt.Println("--------------------map取值--------------------")

	// 取值方式1: 根据 key 获取 map 中的 value
	v_xqz := m4["xqz"]
	fmt.Printf("xqz-value: %v\n", v_xqz)

	// 取值方式2
	v_wss, ok := m4["wss"]
	if ok {
		fmt.Printf("wss-value: %v\n", v_wss)
	} else {
		fmt.Println("key不存在")
	}

	// 遍历map
	fmt.Println("--------------------遍历map--------------------")

	// 遍历方式1: 只要 key
	for key := range m4 {
		fmt.Printf("key: %v\n", key)
	}

	// 遍历方式2: 返回 key 和 value
	for key, value := range m4 {
		fmt.Printf("key: %v, value: %v\n", key, value)
	}

	// 遍历方式3: 只要 value
	for _, value := range m4 {
		fmt.Printf("value: %v\n", value)
	}

	// 删除元素
	fmt.Println("--------------------删除元素--------------------")

	// 定义map
	m6 := make(map[string]int)
	m6["xqz"] = 18
	m6["wss"] = 17
	fmt.Printf("m6: %v\n", m6)

	// 删除元素
	delete(m6, "wss")
	fmt.Printf("m6: %v\n", m6)

	// 删除不存在的元素
	delete(m6, "xinge")
	fmt.Printf("m6: %v\n", m6)

	// 切片类型的map
	fmt.Println("--------------------切片类型的map--------------------")

	sMap := make(map[string][]int, 10)
	sMap["北京"] = []int{1, 2, 3} // 声明并初始化
	fmt.Println(sMap)

}
